@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uDate: 26 Apr 90 01:10:29 GMT From: fernwood!portal!cup.portal.com!Ordania-DM@apple.com (Charles K Hughes) Subject: Upgrades T}finally... Message-ID: <29307@cup.portal.com> To: INFO-ATARI8@WSMR-SIMTEL20.ARMY.MIL Yet another in the series of never enU}ding upgrades.... No, actually, this isn't a "true" upgrade. This ARCed file contains the text & files necessary to play V}boot-disk games from ramdisk. You will need at least a 256k upgrade to use this, and 512k is needed if you want to have foW}ur "ram floppies". m ramdisk. You will need at least a 256k upgrade to use this, and 512k is needed if you want to have fo VFBBC?PAA$@JBTEST.BAS VERSION 1 Y}.0##COPYRIGHT 1990 CHARLES HUGHES9@,9@, ""(INSERT JOYBITTER IN PORT 2!(!(HIT ANY KEY WHEN Z} READYA#@@K:0)@;@>(A((((( SET ALL SWITCHES ON JOYBITTER TO2('OFF' [}POSITION.<!(!(HIT ANY KEY WHEN READYFA#@@K:0)@;@>(A(P*68,-T \}:@,*6-R:@,d,,($NOW SET ALL SWITCHES ON JOYBITTER TOn('ON' POSITION.x!(!(HIT ANY KEY WHEN READY ]}A#@@K:0)@;@>(A(*68,-T:@,*6-R:@,-@@ ^}!68,-@!68,-@)6-'@"P:,)68,-)6-'@"P:,)68,-%6 _}-P:'@,%6-P:'@, @-@#8,8,' =(JOYBITTER IS FINE@2'2(>:AS,JO `}YBITTER IS MALFUNCTIONING.-(-("THE FOLLOWING SWITCHES ARE FAULTY:J-@#8,"8,>( SWITCH # a} J A%  A( FIRE BUTTON$ (UP $ (DOWN$ (LEFT$ (RIGHT$# ( b}CHECK WIRING THEN RERUN.# D2:JBTEST.BASBUTTON$ (UP $ (DOWN$ (LEFT$ (RIGHT$# ( 2JOYBITTER Construction Copyright 1990 by Charles Hughes A JOYBITTER is a small joystick like device for use with any pd}rogram thatneeds 1-5 bits worth of information and doesn't want to get it from thekeyboard. Specifically it is designed foe}r RAMBOOT II.Requirements: 1 Standard Atari Joystick, broken. 1 wire about 4 inches long, stripped of all insulation.f} Wire cutters Wire strippers Solder - rosin core not acid. Soldering Iron - 25 Watts is ideal. Phillips screwdriver.g} 5 Latching keyboard type switches or 5 SPST switches (NOT MOMENTARYCONTACT)Directions: 1) Take the broken joystick h}and turn over. Remove the screws. Turn thejoystick face up. Open the joystick up by removing the top. Take out thered fi}ire button, the white plastic stick, and th black rubber covering. Store these in a safe place - you'll want these to fix soj}me other joystickyou might have. :) Remove the board that has the wires attached, put theboard with all the other parts. k}You should now have the top and bottom ofthe joystick case, with the cable and 6 wires coming out of it. 2) Decide where l}to put your switches. I cut the top center into a roughsquare and used crazy glue to mount 4 latching keyboard switches in m}a 2x2square. The fifth switch I mounted where the old fire button was. One ofyour switches should be mounted in the fire n}button position. The other 4can be mounted anywhere on the top or sides that you like. 3) Drill/cut holes and crazy glueo} your switches in. You should try tokeep the fire button switch away from the others, and keep the other 4switches in 2 sep}ts of 2 each. 4) Cut connector from each wire coming out of joystick cable, strip about1/4 inch of insulation. Solder wiq}res as follows: A) __ Stripped wire to one side of each switch. B) __ Black wire to any point along stripped wirer}. C) __ Orange to other side of fire button switch. D) __ White to other side of any switch. E) __ Blue to s}other side of switch next to White. F) __ Green to other side of switch below White. G) __ Brown to other side oft} switch next to Green. Diagram FIRE | | SW#1 SW#2 | | | | | | O b W b B b u} SW#1 SW#2 | | | | G b Br b Code: b=Black/stripped wire O=Orange Bv}=Blue Br=Brown W=White G=Green 5) Stuff cotton in joystick case if you want. Make sure no wiw}res are inthe way of the screws, and that no bare wire is touching any other. 6) Put the screws back in. 7) All done.x} You are now the proud owner of a joybitter. You aren't quite done...you need to test your Joybitter. Boot up yourcomy}puter with BASIC installed and run the program "JBTEST.BAS". Followthe directions to test out your Joybitter. If it fails z}the test, then openit up and check everything. Once your Joybitter passes this test, then youare finished! Have fun with {}it. Now some notes for others: If you don't have a Standard Atari joystick you will need to figure outwhich wire is|} which. Here is how to do it: Trace the wires inside whatever joystick you do have. The one that goesto all the contacts}}/switches is the Atari BLACK, the one that goes to thefire button only is the Atari ORANGE. The wire to the up switch is At~}ariWHITE, to the down is Atari BLUE. The wire to the left switch is AtariGREEN, to the right is Atari BROWN. Then just fo}llow the instructionsabove. Those of you with a little more experience can do the following: Take a DB9 female housing} & connector, a 6 wire ribbon cable, a dipswitch containing 6-8 switches and wire as follows: DB9 1-4 to one side ofswitch}es 1-4, DB9, DB9 6 to same side switch 6 or 8, DB9 8 to other side ofdip. Then wire bare wire to each switch on the other s}ide. Put it all in asmall box, and you are done. If you have any questions or comments I can be reached at:CLOSER TO} HOME BBS (419) 368-4413ATARI BASE BBS (408) 745-5306BAAUG BBS (408) 986-0215Usenet: Ordania-DM@cup.portal.co}m or Charles_Hughes@cup.portal.comOr USnail: Charles Hughes 555 E. Washington Ave. #301 Sunnyvale, CA 94086 Phone}: (408) 732-7749_Hughes@cup.portal.comOr USnail: Charles Hughes 555 E. Washington Ave. #301 Sunnyvale, CA 94086 Phone ;LL.ACT OCT 15,1987 - R CURZON ;(I/O from PRINT.ACT by Bruce Langdon) ;locate above the G: device by ;CF Johnson, to allow} graphics ;output SET 14=$2F01 SET $491=$2F01 ; command line dos will try to run ; twice unless we put rts at start BYTE r}ts = [$60] ; --System Variables BYTE shflok = $2BE, ch = $2FC, crsinh = $2F0 CARD sdslst = $230 ; --Working globals }; First global ARRAY, other than ; BYTE ARRAY of length < 257, ; is placed AFTER rest of program BYTE ARRAY in_b(257) ; loca}te ; the in_buff ; variables array BYTE ARRAY vars BYTE pr_wid = [80], file_lim = [39], col_lim = [2],} file_marg = [2], line_lim = [56], page_len = [66], top_bl = [5], bott_bl = [5], pause_fl = ['Y], convert_fl = ['S], page}_st = [1] ; PRECEDING SHOULD BE CHANGED ONLY ; WITH CARE IN ORDER FOR "S" COMMAND ; TO UPDATE LL.COM TO WORK BYTE ARRAY }convert_st = " " BYTE c_wds ;command line flag BYTE r_ent =[0] ;flags if program ;entered through Run_En}t BYTE file_l, col_l, line_l BYTE ARRAY out_b CHAR ARRAY out_dev(20), in_fil(20) CARD line_c, file_c, col_c, out_s, } in_s, in_c, out_i, in_i BYTE op_ok, b, page_n, b_wid, col_wid BYTE cio_status ; global for CIO ; return value (p}er ACS convention) INCLUDE "RTIME.ACT" PROC End=*() [$68$AA$68$CD$2E8 $90$5$CD$2E6$90$F3 $48$8A$48$60] ; entry: PLA; }TAX; PLA; CMP MEMLO+1; ; BCC lab; CMP MEMTOP+1; BCC entry; ; lab: PHA; TXA; PHA; RTS ; ; Trace back thru RTS's and ; return t}o cartridge or DOS. ; From ACS bulletin board. ; error routines PROC Sys_Error(BYTE errno) PROC Clr_Dos(BYTE chan) ; seem}s to clear Spartados ; settings for exit to DOS ; (dummy directory) Close(chan) Open(chan,"D:*.*",6,0) Close(chan) RETU}RN PROC My_Error(BYTE errno) Close(2) Close(3) PrintF("error %I. Rerun%E",errno) End() PROC D_Error(BYTE errno) BYT}E i IF errno=128 THEN Close(2) Clr_Dos(3) End() FI PrintF("error %I. Try again%E",errno) op_ok = 0 RETURN CARD FUN}C GetAD(BYTE chan CARD addr, len) ; Block read TYPE IOCB = [BYTE hid,dno,com,sta CARD badr,put,blen } BYTE aux1,aux2,aux3, aux4,aux5,aux6] IOCB POINTER ic BYTE chan16 chan16 = (chan&$07) LSH 4 }ic = $340+chan16 ic.com = 7 ; read ic.blen = len ic.badr = addr [$AE chan16 $20 $E456 $8C cio_status] ; LDX chan J}SR CIO STY cio_status IF cio_status = $88 THEN eof(chan) = 1 FI RETURN (ic.blen) CARD FUNC PutAD(BYTE chan CARD add}r, len) ; Block write TYPE IOCB = [BYTE hid,dno,com,sta CARD badr,put,blen BYTE aux1,aux2,a}ux3, aux4,aux5,aux6] IOCB POINTER ic BYTE chan16 chan16 = (chan&$07) LSH 4 ic = $340+chan16 ic.co}m = 11 ; write ic.blen = len ic.badr = addr [$AE chan16 $20 $E456 $8C cio_status] ; LDX chan JSR CIO STY cio_status} RETURN(ic.sta) PROC Fix_FlSp(BYTE ARRAY filespec) CARD i IF filespec(2) <> ': AND filespec(3) <> ': THEN ; if no }device, prefix "D:" to file filespec^ == +2 i=filespec^ WHILE i>2 DO filespec(i) = filespec(i-2) i =}= -1 OD filespec(1) ='D filespec(2) =': FI RETURN PROC Show_Hdr() Print( " @L@i@t@t@l@e@L@i@s@t@e@r@ @2 - }R Curzon 'LL' =setup @ @ 'RUN 4A60' =rerun 'LL [input [output]]' =command line ") RETURN PROC Show_Vars() PutE() Print}F("@A Printer width : %U%E", pr_wid) PrintF("@B Width per column : %U%E", file_lim) PrintF("@C Number of columns}: %U%E", col_lim) PrintF("@D Between columns : %U%E", file_marg) PrintF("@E Text lines/page : %U%E", line_lim)} PrintF("@F Total lines/page : %U%E", page_len) PrintF("@G Filler lines/top : %U%E", top_bl) PrintF("@H Filler li}nes/bot : %U%E", bott_bl) PrintF("@I Page pause Y/N : %C%E", pause_fl) PrintF("@J ASCII/ATASCII/HEX: %S%E", co}nvert_st) PrintF("@K Starting page num: %U%E", page_st) PrintF("@L Output device : %S%E", out_dev) PutE() Pr}intE("@S Save configuration - @A-@J") PrintE("@X Execute") RETURN PROC Set_Defs() BYTE i FOR i = 1 TO 20 DO in_fil}(i) = ' OD in_fil(0) = 0 page_n = 0 out_dev(0)=2 out_dev(1)='P out_dev(2)=': vars = @pr_wid RETURN PROC Set_Va}rs() BYTE change, i, j, save_fail BYTE loc_err ch = 255 Close(4) Open(4,"K:",4,0) loc_err = 0 save_fail = 0 D}O ; check for bad values, allow ; changes to program variables IF col_lim = 0 THEN col_lim =1 FI IF line_lim=0 T}HEN line_lim =1 FI IF convert_fl ='S THEN convert_st = "ASCII " ELSEIF convert_fl ='T THEN convert_st} = "ATASCII" ELSE convert_st = "HEX " FI crsinh = 1 Put(125) Show_Hdr() Show_Vars() Position(5},21) IF pr_wid< file_lim * col_lim +file_marg * (col_lim-1) THEN loc_err = 1 Print("@I@N@V@A@L@I@D@ @A@},@ @B@,@ @C@,@ @D") ELSEIF page_len # line_lim + top_bl + bott_bl THEN loc_err = 1 Print("@I@N@V@A@L@I@}D@ @E@,@ @F@,@ @G@,@ @H") ELSEIF out_dev(1) >= 'a THEN loc_err = 1 ;should be upperc. Print("@I@N@V@A@L@I@D@ }@L") ELSEIF save_fail = 1 THEN Print("@N@O@ @F@I@L@E@ @D@:@L@L@.@C@O@M") save_fail = 0 loc_err = 0 ; no}t fatal error ELSEIF change = 'S THEN Print("LL.COM revised") loc_err = 0 ; not error ELSE loc_err = 0 } FI shflok = $40 ; upper case change = GetD(4) Position(0,21) Print(" ") crsinh = }0 IF change>= 'a THEN change == -32 FI IF change>='A and change<='L THEN Position(23,change-61) Pri}nt(" ") Position(21,change-61) Print(": ") IF change<'I OR change ='K THEN vars(change }- 65) = InputB() ELSEIF change = 'I THEN IF pause_fl = 'N THEN pause_fl = 'Y ELSE pause_fl = }'N FI ELSEIF change = 'J THEN IF convert_fl = 'S THEN convert_fl = 'T ELSEIF convert_}fl = 'T THEN convert_fl = 'H ELSE convert_fl = 'S FI ELSEIF change = 'L THEN InputMD(}0,out_dev,20) Fix_FlSp(out_dev) FI FI IF change='S AND loc_err= 0 THEN Close(3) Error = D_E}rror op_ok = 1 Open(3,"D:LL.COM",12,0) Error = My_Error IF op_ok = 1 THEN FOR i = 1 TO 13 DO } j = GetD(3) OD ; find the 14th byte FOR i = 0 TO 9 DO PutD(3,vars(i)) OD ; up}date the variables ELSE save_fail = 1 FI Clr_Dos(3) FI UNTIL loc_err= 0 AND change= 'X OD Close(4) }RETURN PROC Alloc_Buffs() CARD size col_wid = file_lim + file_marg b_wid = col_wid *(col_lim) -file_marg + 1 ; s}et index values file_l = file_lim -1 col_l = col_lim -1 line_l = line_lim -1 ch = 255 ; find size and location }of ; the output buffer out_s = (line_lim) * b_wid out_b = sdslst - out_s ; input buffer starting point ; was s}et to end of program ; in variable declarations IF in_b > out_b - 200 THEN PrintE( "@n@o@t@ @e@n@o@u@g@h@ @m@e@m@o@}r@y@!@!") End() FI ; find size of input buffer in_s = sdslst - out_s - in_b RETURN PROC Print_Clear() CARD i, b}_ptr, o_b_ptr BYTE j, k, n, tc, bc, test b_ptr = 0 o_b_ptr = 0 FOR i = 0 to line_l DO ; trim trailng spaces from } ; each print line n = 0 FOR j = 0 to b_wid - 1 DO IF out_b(b_ptr + j) # ' THEN n = j FI OD }; line will be chopped at "n" b_ptr == + n + 1 out_b(b_ptr) = $9B b_ptr == +1 ; slide everything else down } ; over the unused space MoveBlock(out_b + b_ptr, out_b + o_b_ptr + b_wid, (line_l - i) * b_wid) o_b_pt}r = b_ptr OD tc = top_bl bc = bott_bl WHILE tc > 0 DO IF top_bl >3 AND tc= top_bl-2 THEN ; if enough room} print page header PrintD(3,in_fil) FOR i= 9 TO pr_wid-in_fil(0) DO PutD(3,' ) OD PrintD(3,"}Page ") PrintBDE(3,page_n) tc == -1 ELSE PutDE(3) tc == -1 FI OD PutAD(3,out_b,b_ptr) WHILE }bc > 0 DO ;bottom fill lines PutDE(3) bc == -1 OD IF pause_fl= 'Y AND out_dev(1) # 'D THEN PutE() PrintE}("@R@E@T@U@R@N@ @=@m@o@r@e@ @,@B@R@E@A@K@ @=@q@u@i@t") Close(4) Open(4,"K:",4,0) ch = 255 DO test = GetD(4) } UNTIL test = $9B OD Close(4) FI RETURN PROC Rst_Outb() file_c = 0 line_c = 0 col_c = 0 out_i = 0 SetBlock(o}ut_b,out_s,' ) ; 'blank' is not $00! RETURN PROC Compose(BYTE chx) ; find where each character belongs ; in the output} buffer IF chx = $9B OR file_c>file_l THEN out_i == -file_c + b_wid line_c == +1 file_c = 0 FI IF chx = $9}B THEN RETURN FI IF line_c>line_l THEN col_c == +1 out_i = col_c * col_wid line_c = 0 file_c = 0 FI IF }col_c>col_l THEN page_n == +1 IF page_n >= page_st THEN Print_Clear() FI Rst_Outb() ;clear/reset ptrs} FI ; ; out_i now points to where to put ; this character ; out_b(out_i) = chx file_c == +1 out_i == +1 RETURN } PROC Op_File() BYTE dnum BYTE ARRAY dir_wk(21) BYTE ARRAY dir_nm = "Dn:*.*" ch = 255 dnum = 0 op_ok = 1 DO IF in}_fil(0) = 0 OR r_ent = 1 OR op_ok = 0 THEN ; if menu, set position IF (c_wds < 2 OR r_ent = 1) AN}D dnum = 0 THEN Position(25,21) Print(" ") Position(2,21) FI Print("@S@o@u@r@c}@e(RET quits/1-4,8):") shflok = $40 ; upper case dnum = 0 DO UNTIL ch # 255 OD IF ch = 31 THEN dnum =} 1 FI IF ch = 30 THEN dnum = 2 FI IF ch = 26 THEN dnum = 3 FI IF ch = 24 THEN dnum = 4 FI IF ch = 53 }THEN dnum = 8 FI IF dnum # 0 THEN dir_nm(2) = dnum + '0 ch = 255 op_ok = 1 Error = D_Er}ror Close(2) Open(2,dir_nm,6,0) IF op_ok = 1 THEN PrintF("%E%E@D@r@i@v@e@ @#@ %C%E%E", } dnum + '@0 ) DO InputMD(2,dir_wk,20) IF op_ok = 0 THEN EXIT FI PrintE(d}ir_wk) IF dir_wk(1) >= '0 AND dir_wk(1) <= '9 THEN EXIT FI OD PutE(}) FI Close(2) op_ok = 0 Error = My_Error ELSE InputS(in_fil) IF in_fil^ = 0 THE}N End() FI Fix_FlSp(in_fil) FI FI Error = D_Error IF dnum = 0 THEN Close(2) o}p_ok = 1 Open(2,in_fil,4,0) FI UNTIL op_ok OD Error = My_Error RETURN PROC Hcompose(BYTE chx) BYTE t Compose}('$) t =(chx&$F0) RSH 4 + '0 IF t > '9 THEN t == +7 FI Compose(t) ; first digit t =(chx&$0F) + '0 IF t > '9 THEN }t == +7 FI Compose(t) ; last digit RETURN PROC Print_File() BYTE t CARD i Rst_Outb() Op_File() Close(3) Open(3},out_dev,8,0) IF convert_fl = 'T THEN DO in_c =GetAD(2,in_b,in_s) FOR i = 0 TO in_c - 1 DO Compose}(in_b(i)) OD IF eof(2) THEN page_n == +1 Print_Clear() EXIT FI UNTIL eof(2) OD ELSEI}F convert_fl = 'H THEN DO in_c =GetAD(2,in_b,in_s) FOR i = 0 TO in_c - 1 DO Hcompose(in_b(i)) O}D IF eof(2) THEN page_n == +1 Print_Clear() EXIT FI UNTIL eof(2) OD ELSEIF convert_fl ='S }THEN DO in_c =GetAD(2,in_b,in_s) FOR i = 0 TO in_c - 1 DO IF in_b(i) =$9B THEN Compose($9B}) ELSE t = in_b(i) & $7F IF t >26 AND t <32 OR t =96 OR t >122 THEN Hcompose(in_b(i})) ELSE IF in_b(i) > $7F THEN Compose('@) FI IF t < 27 THEN Com}pose('^) Compose(t + $40) ELSE Compose(t) FI FI FI OD IF }eof(2) THEN page_n == +1 Print_Clear() EXIT FI UNTIL eof(2) OD FI Close(2) Clr_Dos(3) RETURN } PROC Get_wds() CARD POINTER dosvec = $0A BYTE POINTER comtab_ptr1 BYTE POINTER comtab_ptr2 BYTE ARRAY c_line, wk_d } BYTE i, j, eol_fl in_fil(0) = 0 comtab_ptr1 = dosvec^ + 3 c_wds = 0 ; no of words on command line ; 0 means not a co}mm line type DOS ; command line DOS's have a JMP instr ; at comtab + 3 to file crunch ; routine IF (comtab_ptr1^) # $4C TH}EN RETURN FI ; but make sure it's not Machdos ; (no command line) comtab_ptr1 = dosvec^ + 6 comtab_ptr2 = dosvec^ }+ 9 IF (comtab_ptr1^) = $4C AND (comtab_ptr2^) = $4C THEN RETURN FI c_line = dosvec^ + 63 ; get command line} words eol_fl = 0 i = 0 DO ; find start of word DO IF c_line(i) = $9B OR i > 63 THEN eol_fl }= 1 EXIT ELSEIF c_line(i) # ' THEN EXIT ELSE i == +1 FI OD IF eol_fl THEN EXIT FI ; trace to end of wor}d, store j = 1 c_wds == +1 ; ignore 1st word only IF c_wds = 2 THEN wk_d = in_fil ELSEIF c_wds=3 THEN wk_d=o}ut_dev FI IF c_wds > 1 THEN DO wk_d(j) = c_line(i) i == +1 IF c_line(i) = $9B OR i > 6}3 THEN eol_fl = 1 FI IF c_line(i) =' OR eol_fl =1 THEN wk_d(0) = j EXIT FI j == +1 } OD Fix_FlSp(wk_d) ELSE DO i ==+1 IF c_line(i) = $9B THEN eol_fl = 1 EXIT E}LSEIF c_line(i)=' THEN EXIT FI OD FI UNTIL eol_fl = 1 OR c_wds = 3 OD RETURN PROC Run_Ent() ; entry poi}nt for RUN dos command r_ent = 1 PROC Main() device = 0 ; suggested by ACS Sys_Error = Error Error = My_Error Set_}Defs() ; check if command line type DOS, ; and if filename on the command ; line Get_wds() DO IF c_wds > 1 AND r_}ent = 0 THEN Show_Hdr() ELSE Set_Vars() FI Alloc_Buffs() Print_File() Set_Defs() IF c_wds > 1 T}HEN EXIT FI OD Close(2) IF out_dev(1) = 'D THEN Clr_Dos(3) ELSE Close(3) FI RETURN Set_Defs() IF c_wds > 1 T^/J`JlaP'8BYS /ny;/; lab: PHA; TXA/A; RTSl;l; Trace back thruhihiHH}ȱȱ`8Hh` /E…¦ /`L/` /"Ff e}e&8L/ Fj` &`p B V8l "0 Vhhl60HHJJJJhh`hhl60 `iDi}E`Hh80`Hh`Hh`Hh` Y0IHiDiE B 90HI B 90`ԆՄ ؠ0}8)ȑ`0L0II襢 0iȑȩ-`H 0 0hL0 0L21LA1 0L0 w0LL1 0L0 w0LX1}ȩ$&*i0:iȑ`80 LFĆ>%>Ć5%/E)ԵH膇h}CI4H:L > 3470460]/L=D:LL.COM }= }3R470Q460]/IL> : :L= g3 : :L= : :L>/m :/i e2 :L=L>: }!4:L/> :IXL<: 3`L=> /m /a/ /a/ /8 /i`/8 / /8 /!/8 /"/`/} / /S/T/80S/#/1T/$/8#/ȅ$///L>L>> ^1 480S/1T/8/U/}/V/` THEN\L/?#?"?%?$?!? ?"/Y?Y? ?!?La@c(?&?8`/v?v?&?L? "?m&?#?i#/e$/e}I L?&?(?&?Lk?"?m(?#?ii"?i#?#/m"?$/m#?"?#?#/m"?$/m#?#/m$?$/m%?m`}/i8"/ ?!?`/ / 3#?%?"?$? ?!?LI?/)?/*?)?L A/L@8/)?E}L@/9 L1!? ?8/9/@@ ?!?L@  e2 ?!?L@L@Page @֩ L1_/ G18)?)?LA }28)?)?Lm@#}?"?$/#/ 5*?L:A }28*?*?LA/IYLA&/IDLA 2LnAΠ堬ˠAT ^1 3LAK:}A} }3 g3+?+?ILA 3`LAP/O/N/M/R/Q/Z/Y/T/ S/$/#/ 3` LAAAI /O/P/L6B8}Y/O/Z/P/m`/Y/iZ/M/N/P/O/AILAB`"/M/N/LBQ/R/a/R/Q/ /Y/Z/N/M/P/O/!}/Q/R/LB_/_//LB ,? A#/mY/$/mZ/AO/P/Y/Z/` /(4)IY PosDn:*.*BLBBȌ]/9}//I]/LD/ /ILTCBLTC 3LDC C7 R1 3LpC(RET quits/1-4,8):CW R1@ }BILCILCBILCBILCBILCBI5LCBBLDBiBiBi0!}Ȍ]/470460 3BB }3]/ILDLDD%E%E堣%C%E%EBiD1 1Bϩ O3]/LqDLDB ^"}1B0LD9BLDLDLYD 2 3]/R470Q460LD/9 a39/LD 4/9 '6470460BLD 3]//9 #}}3]/LBR470Q460`LE E$ A E)JJJJi0 E9 ELBE Ei E E A E)i0 E9 ELjE Ei E E A`$}VLwE A B 3/% }3/ITL+FV/U/// 4X/W/sErE8W/EX/EErEEsELF /mr%}E/msE ArEsELEL F_/ ,?L(FLELG/IHLFV/U/// 4X/W/sErE8W/~FX/&}F~FrEFsELFF /mrE/msE ErEsELmFLF_/ ,?LFL5FLG/ISLGV/U/// 4X/'}W/sErE8W/GX/GGrEGsELGro/mrE/msEIL tE 9/LJLJLJ 3&/IDL/}J !4LJ 3``hJkJ80704604R470Q460 9 H/LJ/LJ 7LJ : :> tE 9/LJLJLJ 3&/IDL LittleLister 2 features: ------------------------ INPUT: file formatted in a single column, or unformatted. OUTPUT: for1}matted in n columns, [ 0 < n < 256 ] with several options. Use with any DOS: ----------------- With a command lin2}e DOS such as SpartaDOS or DOS XL, type LL [input [output]] Used with this command line, LL starts without present3}ing a menu; the variable settings last SAVED will be in effect. File specifications may be used for input/output, and the "D4}:" prefix is assumed by default. Output defaults to "P:" (printer). "LL" alone will bring up the menu. With other DOS's, 5}just load LL like any other binary file, and work from the menu. Variables include: ------------------ *input file *output d6}evice (default = P:) *starting page number (default = 1) page pause output options ASCII (^ prefixes control 7}characters; @ prefixes inverse characters; few special chars output in hex) HEX (all bytes represented in HE8}X - e.g. $FF) ATASCII (no transformation of bytes from input file) output width output page length number9} of columns column width margin between columns filler lines at top and bottom * - not included in variables SAVED by:} menu choice 'S' Other features: --------------- -you can save special configurations of LL.COM, by using 'S' option a;}nd copying to a different *.COM filename -outputs page header with filename, and page number (if you select at least<} 4 filler lines before the first text line) -allows any single column file to be produced in multiple columns: progr=}am listings, database output, utility output, etc. -chops off blanks at the end of each text line (useful for trimming >} Action! source code) -produces output to any device (but page pause is disabled when output is to disk file) -try AT?}ASCII output to G: device, the graphics printer utility for Epson/Star & compatibles released by Analog in October 1@}985 issue - very nice ATASCII output. -Action! programmers may output HEX to disk to transform binary files (charactA}er sets, code blocks) to blocks for the Action! compiler. Version 2 notes: ---------------- - added HEX output - compiledB} high enough to allow use of the G: device by CF Johnson, for pretty graphic ATASCII output. added HEX output - compileda For those interested in the Action! language, this is the LittleLister source code. In order to represent the non-ASCII ch!D}aracters, it was prepared by LittleLister itself. It prefixes the inverse video characters with a "@" -- so it will need som!E}e editing to run... If you are checking out compiled languages for the 8bit, you will note Action! has similarities to Pas!F}cal and C, as can be seen in this example. And it is faster in compilation, and compactness of code produced than any other !G}hi-level language on the 8 bit. A pleasure to use, comes with a good built-in program editor. Potentially interesting thi!H}ngs: procedure GetAD(), PutAD() - block I/O suggested by Bruce Langdon procedure Get_Wds() - gets the words fr!I}om the command line for Sparta DOS, DOS XL as well as detecting whether the DOS in use has command !J}line capability procedure End() - goes to DOS (not too tricky), but this procedure also keeps the stack clear, !K}regardless of how deeply nested you are when you call it. procedure Clr_Dos() - a work around. I found that if!L} I returned to SpartaDOS, when the last disk access was for write or update, I often got some out-o!M}f-control disk writing. This function ensures that the last disk access was a read before we exit t!N}o DOS. [If anybody can explain, I would like to know what causes this!] as a read before we exit t V This is a little program I have found useful for printing out text, especially Action! source listings, and saving time & pa%P}per. It may be useful for other text printing jobs too, e.g. sources that are saved to disk in ATASCII text form. Check the%Q} LL.DOC file included below for a quick rundown. PRINTER OUTPUT OPTION Littlelister composes columnar output in memory. It%R} can be used with any printer, to print any size of input file. I wrote it for my 1027, but it works even better with my new%S} NX-10 printer. For maximum speed printing, it can be set to represent "unprintable" bytes with combinations of printable on%T}es; full graphics ATASCII printing is also possible using G: (see below). THE CODE The UUencoded binary file follows in a s%U}eparate message. If it doesn't make it through some gateway in its travels, I will mail a copy direct on request. For least%V} frustration, use the YAU UUdecoder to decode it. It seems some of the other decoders might require extra padding on each lin%W}e; I used YAUE to encode it. Action! sources also available on request, due to length I haven't posted them... yet) (Thanks%X} to JRD: YAU and YAUE are very nice tools; they work fine with SpartaDOS in both command line and prompt modes.) (Thanks also%Y} to Bruce Langdon, for the ideas in his PRINT.ACT program posted to Usenet some time ago) ne and prompt modes.) (Thanks also$[10 .TITLE "Atari Midi Interface"20 .PAGE "C Terpin 1991"30 ; created: 06/89 revised:03/9140 ;50 ; Midi 'V:' Handler60)[} ;70 ; Christopher Terpin80 ; 144 Eggert Road90 ; Buffalo, N.Y. 142150100 ; terpin@autarch.acsu.buffalo.edu0110 ; or)\} terpin@ubunix.acsu.buffalo.edu0120 ;0130 ; THIS SOURCE CODE IS IN THE0140 ; PUBLIC DOMAIN.0150 ; Please feel free to mod)]}ify and0160 ; improve this code. Please0170 ; let me know about any major0180 ; improvements or bugs you0190 ; have disc)^}overed. Enjoy!0200 ;0210 ;0220 ;0230 ; execution from AtariBASIC:0240 ;1. POKE 106,154:GR.0:DOS0250 ;2. load D:MIDI.OBJ)_}0255 ;3. run BASIC cartridge0260 ;4. I=USR(39168,cmd,[start, end],speed) (see below)0270 ;------------------------------0)`}280 ; to initialize V: handler:0290 ; I=USR(39168,ASC("I"))0300 ; CLOSE #1:OPEN #1,8,0,"V:"0310 ; use ?#1; or PUT #1 to se)a}nd midi codes (i.e. ?#1;"A@";)0320 ;------------------------------0330 ;0340 ; to reset normal serial i/o:0350 ; I=USR(3)b}9168,ASC("C"))0360 ;-------------------------------0370 ; to record:0380 ; I=USR(39168,ASC("R"),ADR(A$))0390 ; POKE 204,1)c} to start recording0400 ; POKE 204,0 to stop recording0410 ; L = PEEK(205)+256*PEEK(206)0420 ; is # of bytes recorded04)d}30 ;------------------------------0440 ; to playback:0450 ; I=USR(39168,ASC("P"),ADR(A$),ADR(A$)+L)0460 ;-----------------)e}-------------0470 ; to record B while playing A:0480 ; I=USR(39168,ASC("R"),ADR(B$))0490 ; POKE 204,1 :I=USR(39168,ASC("P")f}),ADR(A$),ADR(A$)+L):POKE 204,00500 ;------------------------------0510 ;0520 ; equates0530 ;0540 AUDCTL=$D208 ; pokey )g}register0550 OUTBUF=$CB ; character for output0560 SWITCH= $CC ; 0==stop recording0570 BUFADD = $CD ; pointer to buffe)q}XB%DOS SYSB*)DUP SYSBSBLURB TXTB XJBTEST BASB#cJOYBITTRTXTBpLL ACTB:LL COMB0LL DOCB CLL T2 B OLL TXTBaZMIDI ASMB,MIDI BASBMIDIHW TXTB MOUSE COMBMOUSE DOCBMOUSE TXTB OSON COMB!OSRD COMBD%RAMBOOT2TXTBiREAD ME BoSOFTBOOTCOMBpULT4 ROSr for recording0580 PLAYBUF = $CF ; pointer to buffer for playback0590 CH = $2FC ; last key pressed0600 RECVDN = $39 ; )r}receive flag0610 SERIN = $D20D ; serial i/o0620 SEROUT = SERIN0630 ;0640 VSERIN=$020A ; interrupt vector for serial inpu)s}t0650 VSEROR = $20C ; interrupt vector for serial output ready0660 VSEROC = $20E ; interrupt vector for serial output compl)t}ete0670 ;0680 AUDF3=$D204 ; pokey ch3 :baudlo0690 AUDF4=$D206 ; pokey ch4 :baudhi0700 XMTDON=$3A ; transmit done flag07)u}10 SSKCTL=$232 ; serial port control shadow0720 SKCTL=$D20F ; serial port control (W)0730 SKSTAT=$D20F ; serial port status)v} (R)0740 SKRES= $D20A ; resets SKSTAT0750 POKMSK=$10 ; shadow of IRQEN0760 IRQEN=$D20E ; interrupt request0770 HATABS=$3)w}1A ; pointer to handler table0780 MIDIL= 22 ; midi baud rate0790 MIDIH = 0 ; values0800 RD = 4 ; CIO: open for re)x}ad0810 WR = 8 ; CIO: open for write0820 CPUT = 11 ; CIO: PUT command0830 COPEN = 3 ; CIO: OPEN command0840 CCLOS)y}E = 12 ; CIO: CLOSE command0850 ;0860 ; input-output control block (iocb)0870 ; structure:0880 ;0890 ICCOM = $342 ; comm)z}and0900 ICAX1 = $34A ; aux10910 ICAX2 = $34B ; aux20920 ICBAH = $345 ; buffer address hi0930 ICBAL = $344 ; buffer addres){}s lo0940 ICBLL = $348 ; buffer length lo0950 ICBLH = $349 ; buffer length hi0960 CIOV = $E456 ; Central I/O vector0970 ;)|}0980 ;0990 ; countdown timers1000 ;1010 CDTMA1 = $0226 ; timer1 vector1020 CDTMA2 = $0228 ; timer2 vector1030 CDTMF5 = $)}}022E ; timer5 flag1040 SETVBV = $E45C ; set vblank1050 CONSOL = $D01F ; used for keyboard click1060 ;1070 MARK = 255 ; bu)~}ffer timing mark1080 CTRLC = 146 ; control-c key1090 ;1100 *= $99001110 ;1120 ;1130 START1140 PLA1150 PLA1160 PL)}A get command1170 ;1180 CMP #'I1190 BNE OPT21200 JMP SETHAND ; setup CIO handler1210 ;1220 OPT2 CMP #'R12)}30 BNE OPT31240 JMP RECORD ; midi record1250 ;1260 OPT3 CMP #'P1270 BNE OPT41280 JMP PLAYBACK ; midi playback1290)} ;1300 OPT4 CMP #'C1310 BNE NOOPT1320 JMP RESET ; reset ser port1330 NOOPT SEC ; error1340 RTS1350 ;-----------)}------------------1360 ; MIDI "V:" handler1370 ;1380 SETHAND1390 LDY #0 ; add our handler1400 LPHND LDA HATABS,Y141)}0 CMP #0 ;free entry?1420 BEQ FOUND ;yes..1430 INY ;no, skip 3 bytes1440 INY1450 INY1460 CPY #34 ; )}end of table?1470 BNE LPHND ; no...keep looking1480 SEC ; yes..full table!1490 RTS ; quit with error150)}0 ;1510 FOUND LDA #'V ; "V:" handler1520 STA HATABS,Y ; save in table1530 INY1540 LDA #VTABL&255 ; store address155)}0 STA HATABS,Y ; of vector1560 INY ; table in1570 LDA #VTABL/255 ; handler table1580 STA HATABS,Y1590 ;)}1600 ; save interrupt vectors1610 ;1620 LDY #51630 SAVESER LDA VSERIN,Y1640 STA SAVEVEC,Y1650 DEY1660 BPL SAVESER1)}670 ;1680 RTS1690 ;1700 SAVEVEC .BYTE 0,0,0,0,0,01710 ;1720 ;--------------------------1730 ; begin MIDI Handler1740 )};1750 ; vector table:1760 VTABL .WORD VOPEN-11770 .WORD VCLOSE-11780 .WORD NOFUNC-1 (get)1790 .WORD VP)}UT-11800 .WORD NOFUNC-1 (status)1810 .WORD NOFUNC-1 (special)1820 JMP VINIT ; initialization1830 ;----------)}-------------------1840 VCLOSE1850 VOPEN LDA #01860 STA MODE1870 VINIT1880 RETURN1 LDY #1 ; return success1890 NOFUNC )}RTS1900 ;-----------------------------1910 ;1920 ;1930 ;1940 ;----------------------------1950 ; PUT function1960 ;19)}70 VPUT STA OUTBUF ; save accumulator1980 LDA MODE ; write mode ?1990 CMP #WR2000 BEQ WRMODE ; yes...2010 LDA #WR )}; no..set flag2020 STA MODE ; and2030 JSR SETIO ; set up for serial output2040 ;2050 WRMODE LDA OUTBUF ; retrieve byt)}e2060 STA SEROUT ; send it out &2070 WAIT LDA XMTDON wait for irqs2080 BEQ WAIT to do their2090 LDA #0 )} stuff...2100 STA XMTDON reset flag2110 LDY #1 exit2120 RTS with success2130 ;---------)}-------------------2140 ;2150 ;2160 ;----------------------------2180 ; enable serial I/O2190 SETIO LDA #$73 ; ALLOW I &)} O concurrently!2200 CONT STA SSKCTL ; set the serial port control,2210 STA SKCTL and shadow2220 LDA POKMSK ; )}get irqen mask2230 AND #$CF ; no keyboard interrupts2240 CLC2250 ORA #$30 ;allow both types2260 STA POKMSK )} of serial interrupts2270 STA IRQEN2280 LDA #MIDIL2290 STA AUDF3 ;set 31.5k baud2300 LDA #MIDIH rate for i/o2)}310 STA AUDF4 in POKEY2320 LDA #$28 ; clock ch3 with 1.79MHz2330 STA AUDCTL ; & link ch3 to ch42340 ;2350 L)}DA #0 ; reset transmit2360 STA XMTDON done flag2370 RTS2380 ;2390 ;2400 MODE .BYTE 0 ; read/write mode flag2)}410 ;2420 ;------------------------------2430 ; reset serial port2440 RESET2450 LDA #$032460 STA SSKCTL ; disable247)}0 STA SKCTL serial port2480 LDA POKMSK interrupts2490 AND #$C02500 STA POKMSK2510 STA IRQEN2520 LDA #02530)} STA SWITCH2540 STA XMTDON2550 LDY #5 ; restore vectors2560 RESTV LDA SAVEVEC,Y2570 STA VSERIN,Y2580 DEY2590 )}BPL RESTV2600 RTS2610 ;----------------------------2620 ;2630 ;2640 ; interrupt service routine2650 ; for serial input)} ready2660 ;2670 ;----------------------------2680 ISRSIR TYA2690 PHA save y register2700 LDA SKSTAT reset )}latches2710 STA SKRES in case of overrun2720 LDA SWITCH check software switch2730 BEQ LEAVIT switch on?2740 LD)}Y #0 ; yes,save interval2750 LDA INTERVAL2755 CMP #2 ; 2 jiffies?2760 BCC TOOSHORT ;time is too short2770 L)}DY #12780 STA (BUFADD),Y2790 LDA #MARK2800 LDY #02810 STA (BUFADD),Y2820 STY INTERVAL ; reset counter2830 LDY #2)}2840 TOOSHORT LDA SERIN ;load serial input2850 STA (BUFADD),Y store input2860 INY in buffer &2870 TYA288)}0 CLC2890 ADC BUFADD2900 STA BUFADD increment the2910 LDA BUFADD+1 buffer pointer2920 ADC #02930 STA BUFAD)}D+12940 ;2950 LEAVIT LDA #$FF set recvdn flag2960 STA RECVDN2970 PLA restore the2980 TAY y register2990 PLA)} and the accumulator3000 RTI & return from interrupt.3010 ;-----------------------------3020 ;3030 ;3040 ;-------)}----------------------3050 ; TIMER ROUTINE3060 ;3070 ; inserts timing marks3080 ; to count time interval3090 ;3100 ;---)}-------------------------3110 TIMER3120 LDA SWITCH ;are we recording?3130 BEQ SETTIM ;NO...reset this vbi3150 IN)}C INTERVAL ; count # of marks3160 CMP #255 ; max count?3170 BNE SETTIM ; no, continue3190 LDY #0 ; writ)}e to buffer3200 LDA #MARK ; timing mark3210 STA (BUFADD),Y3220 LDY #13230 LDA #2553240 STA (BUFADD),Y3260 LDA)} #0 ; reset counter3270 STA INTERVAL3280 ;3290 CLC ;increment the3300 LDA BUFADD ; buffer point)}er3310 ADC #2 ; by two3320 STA BUFADD3330 LDA BUFADD+13340 ADC #03350 STA BUFADD+13360 ;3370 ;3380 SETTI)}M3390 LDA #TIMER&255 ; reset the3400 STA CDTMA2 timer vector3410 LDA #TIMER/2563420 STA CDTMA2+13490 LDY #1 )} ; speed lo (1 jiffy)3500 LDX #0 ; speed hi3510 LDA #2 ; use timer 23520 JSR SETVBV ; start it!3530 RTS)} ; done..3540 ;------------------------------3550 ;3560 ;3570 ;3580 ;-----------------------------3590 ; REC)}ORD routine3600 ;3610 ;3620 RECORD3630 PLA3640 STA BUFADD+1 ;address of3650 PLA recording buffer3660 S)}TA BUFADD3710 LDA #03720 STA INTERVAL ; reset counter3730 STA RECVDN ; reset input flag3740 JSR SETTIM ; sta)}rt timer3750 LDA #ISRSIR&2553760 STA VSERIN ;setup serial3770 LDA #ISRSIR/256 input interrupts3780 STA VSERIN+1)}3790 JSR SETIO ;enable serial input3800 RTS ; done!3820 INTERVAL .BYTE 03830 ;-----------------------------)}3840 ;3850 ;3860 ; PLAYBACK routine3870 ;3880 PLAYBACK3890 PLA3900 STA PLAYBUF+1 ; playback buffer3910 PLA3920 )}STA PLAYBUF3930 PLA3940 STA ENDBUF+1 ; pointer to end of buffer3950 PLA3970 STA ENDBUF4020 ;4030 LDA #04040 STA)} DONE ; reset flag4050 ;4060 LDA #ISEROR&255 ; set up4070 STA VSEROR serial output4080 LDA #ISEROR/256 r)}eady4090 STA VSEROR+1 interrupt4100 ;4110 LDA #ISRTD&255 ; set up4120 STA VSEROC serial output4130 LDA )}#ISRTD/256 complete4140 STA VSEROC+1 interrupt4150 JSR SETIO4160 ;4170 ;4180 ;4190 ;4200 ;------------------)}------------4210 ; output buffer4220 PLAYLOOP4230 LDY #04240 LDA (PLAYBUF),Y ; get note4250 CMP #MARK ; is it a ma)}rk?4260 BNE ISMIDI ; no...4270 LDY #1 ; yes...wait4280 LDA (PLAYBUF),Y4290 TAY ; Y=jiffys to wait4300 )} LDA #$104310 STA CDTMF54320 LDX #04330 LDA #54340 JSR SETVBV ; start timer 54350 WAITLOOP LDA CDTMF5 ; dumdedum..)}4360 BNE WAITLOOP4370 ;4380 LDA #24390 JSR INCPLAY ; inc buffer by 24400 LDA CH ; check for break4410 CMP #C)}TRLC4420 BNE PLAYLOOP4430 RTS4440 ;4450 ISMIDI JSR VPUT ; otherwise send it4460 LDA #14470 JSR INCPLAY ; incr. )}by 14480 LDA DONE ; finished?4490 BEQ PLAYLOOP ; no....4500 RTS ; yes..quit4510 ;4520 ;4530 ;4540 INCP)}LAY4550 CLC ; increment4560 ADC PLAYBUF playbuf by A4570 STA PLAYBUF4580 LDA PLAYBUF+14590 ADC #0460)}0 STA PLAYBUF+14610 ;4620 CMP ENDBUF+1 ; end of song?4630 BCC NOTEND4640 LDA PLAYBUF4650 CMP ENDBUF4660 BCC NOT)}END ; no..4670 LDA #1 ; yes...4680 STA DONE set done flag4690 NOTEND RTS4700 ;4710 ;4720 ENDBUF .)}BYTE 0,04730 DONE .BYTE 0,04740 ;4750 ;4760 ;4770 ;4780 ;-----------------------------4790 ; serial output ready4800 )}; interrupt service routine4810 ;4820 ISEROR4830 ;4840 LDA POKMSK ; enable4850 ORA #$08 the transmit done4860 ST)}A POKMSK interrupt4870 STA IRQEN4880 PLA ; pop accumulator4890 RTI4900 ;4910 ;---------------------------49)}20 ; Transmit Done Interrupt4930 ;4940 ISRTD4950 LDA #$FF ;set transmit4960 STA XMTDON done flag4970 LDA POK)}MSK4980 AND #$F7 ;disable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---)}-------------------------isable tdi4990 STA POKMSK5000 STA IRQEN5010 PLA ;restore accum.5020 RTI5030 ;---(FG#5FILEACHOICDUBHBLIOCIOCBICCOICSTICBAICBAICBLICBLERRO-}  ATARI 8B-}IT MIDI RECORDER by Christopher Terpin 1991%%terpin@autarch.acsu.buffalo.edu(2<load in ml routinesF-}K;@ ,filenameP #BU;'6-@ $A@%@ $AV36-;$9900Z3A'AV-}!+3MOVE HIMEM DOWN[% +@%(@ LOADING...d"n As:-@@:(@-}P:$A'A(,%x# %6-%@# AMAIN MENU,6-?:<@:I,,,INITIALIZE CIO HANDLER-}56-P:+I:,&A0,,5SIZE OF SONG BUFFERO ;,"67@,.>:AU,467,.>:AU,C67@,.O6--}-@-@@K3 (}-@@3(ɠɠAR@.-}-@@.(by Chris Terpin 19916-@@6(Choose one of the following:,-@@,(()-}est midi output"-@@ "(()ecord -@@ (()lay -@@ (()ave -@-}@ (()oad -@@ (()uit"+-@@ +( bytes recorded'+-@@!+(B:,-} byte buffer,)@6">:,4T A" A@">:,4R A " AJ">:,4P A0" -}AT">:,4S A@" A^">:,4L AP" Ac">:,4O A`" Ah>:,4Q -}A`r AԠɠś@""@@VPLAY CHROMATIC SCALE-}ON CHANNEL 1-@6@$&(@>:,@&NOTE ON.-@@ 8'(@>:,-}'NOTE OFFB L$ ě 6-?:<@:R,AH**6-F:A,%AV$F:A,&C:,R +\$ -}˛ R +@"(@playing=(@ Ԡ̭R(@Ϡ ''6-?:<@:P, 6-}-?:<@:C,,reset sio AA+@+@@(@7@<,@$-}((ERROR::F:A,!( hit a key)@!$ ěAR9 (}-@@5(-}LOAD: Enter filename96-?:<@:C,,reset sio*6-P:C:,'AV,*6-C:,&AV$5 AQ6-@-}5@I6-$@6-A4%-6-A5%;6-A6%I6-A7%6-A@%6-AA-}%?@'3?AU$6-?:C:hhhLV,<,$call cio" 6-F:,"6-F:,-}%AV$F:,)A6(ERROR:))@P$p ԛz6-?:<@:C,,AR'!!104-},104,104,201,73,208,3,76'33,153,201,82,208,3,76,85$'!!154,201,80,208,3,76,116,154.' 201,67,208,3,76,183,153,568'-}96,160,0,185,26,3,201,0B'""240,9,200,200,200,192,34,208L'242,56,96,169,86,153,26,3V'!!200,169,86,153,26,3,200,169`'-}153,153,26,3,160,5,185,10j' 2,153,80,153,136,16,247,96t'0,0,0,0,0,0,100,153~'%%100,153,107,153,108,153,107,153'-}""107,153,76,106,153,169,0,141'""182,153,160,1,96,133,203,173'182,153,201,8,240,8,169,8'$$141,182,153,32,142,153,-}165,203'##141,13,210,165,58,240,252,169'0,133,58,160,1,96,169,115' 141,50,2,141,15,210,165,16'41,207,24,9,48-},133,16,141'!!14,210,169,22,141,4,210,169'0,141,6,210,169,40,141,8'210,169,0,133,58,96,0,169'3,141,50,2,141-},15,210,165(!!16,41,192,133,16,141,14,210 ( 169,0,133,204,133,58,160,5( 185,80,153,153,10,2,136,16(""247,96,152,-}72,173,15,210,141((!!10,210,165,204,240,42,160,02(""173,115,154,201,2,144,15,160<(!!1,145,205,169,255,160,0,145F(""20-}5,140,115,154,160,2,173,13P($$210,145,205,200,152,24,101,205Z(##133,205,165,206,105,0,133,206d(##169,255,133,57,104,168-},104,64n($$165,204,240,37,238,115,154,201x(""255,208,30,160,0,169,255,145(##205,160,1,169,255,145,205,169(""0,141,1-}15,154,24,165,205,105(!!2,133,205,165,206,105,0,133(!!206,169,24,141,40,2,169,154(141,41,2,160,1,162,0,169( 2,-}32,92,228,96,104,133,206(##104,133,205,169,0,141,115,154(""133,57,32,65,154,169,218,141(10,2,169,153,141,11,2,32-}(""142,153,96,0,104,133,208,104(%%133,207,104,141,245,154,104,141(##244,154,169,0,141,246,154,169(!!248,141,12,2,16-}9,154,141,13)2,169,3,141,14,2,169,155)141,15,2,32,142,153,160,0)""177,207,201,255,208,35,160,1")!!177,207,168,-}169,16,141,46,2,)162,0,169,5,32,92,228,1736)46,2,208,251,169,2,32,215@)##154,173,252,2,201,146,208,214J) 96,32,1-}09,153,169,1,32,215T)##154,173,246,154,240,200,96,24^)##101,207,133,207,165,208,105,0h)$$133,208,205,245,154,144,12,165-}r)!!207,205,244,154,144,5,169,1|)141,246,154,96,0,0,0,0)165,16,9,8,133,16,141,14)##210,104,64,169,255,133,58,16-}5)!!16,41,247,133,16,141,14,210)104,64,-1 D:MIDI.BAS65,16,9,8,133,16,141,14)##210,104,64,169,255,133,58,16,D Article 4783 of comp.sys.atari.8bit: From: terpin@acsu.buffalo.edu (christophe d terpin) Newsgroups: comp.sys.atari1}.8bit Subject: Homemade MIDI Interface -- Part 1 of 2 Summary: How to build midi interface for Atari 8bit Keywords: MID1}I, interface Date: 28 Mar 91 02:51:18 GMT Sender: news@acsu.Buffalo.EDU Organization: SUNY Buffalo Homemade MID1}I interface for the Atari 8-Bit ------------------------------------------- Parts List: 1 7404 TTL Hex Inverter OR 741}00 NAND gate 2 220 ohm resistors (10%) 1 Atari serial port plug for your computer 2 5-pin Midi plugs (RCA) for yo1}ur midi keyboard 1 breadboard/experimenter perf board 1 project case approx. 10 ft. of 3 wire cable twist ties t1}o tie down wires etc.. The serial port pins as seen on the computer are: 2 4 6 8 10 12 1} o o o o o o o o o o o o o 1 3 5 7 9 11 13 1 - Clock In 7 - 1}Command 2 - Clock Out 8 - Motor Control 3 - Data In 9 - Proceed 4 - Ground 10 - +5V 1} 5 - Data Out 11 - Audio In 6 - Ground 12 - +12V 13 - Interrupt For this project, we will only 1}need to use pin #'s 3,4,5, and 10 of the serial port. --------------- (CRUDE) 1} Ground (pin 4) SCHEMATIC: 7404 | |\ |\ 1} 2| | \ | \ 220 ohm 5 o 4 data out ---| O--| O---\/\/\/---------o o---/\/\/\/-1}- +5 (pin 10) from computer | / | / 3 o o 1 (pin 5) |/ |/ MIDI OUTPUT cabl1}e to synth 2 5 o 4 Ground---o o------------(optoisolator)------- data in to computer1} 3 o o 1 (pin 3) MIDI INPUT cable from synth Pins 1,3 of the 2}Midi Output cable and pins 1,2,3 of the Midi Input cable are not connected. The optoisolator is optional, although it 2}is recommended for extra protection for your midi keyboard. I have used the interface hard wired without the optoisolat2}or without any problems (so far). Also note: the normal serial i/o to the disk will sometimes interfere with the midi 2}interface and vice versa. This sometimes results in a note sounding on the synth when loading or saving a file, or the 2}disk will glitch if you try playing the keyboard during disk i/o. One possible way to remedy this annoying problem is to re2}place the 7404 with a tri-state buffer which can be turned to a high-Z state using the motor control (pin 8) from the ser2}ial port. Anyway, BE CAREFUL and check all your wiring before you hook the interface up to the synthesizer. P2}lease let me know if you have any suggestions for improving the interface. next:: BASIC Midi Recorder Program 2} New & Improved Assembly Source Code --------------------------------------------------------------- Christopher Terpi2 }n terpin@autarch.acsu.buffalo.edu r Terpi0v* M`Mݝ%BLLA} B>DEHI VLx6 } BbDEHI VL| - XL - XE | BDEHI VL| M: | BНD6 }EHI VL| Ver. 1.3 (c)1987 | BDEHI VLT| By: G. M. Filion | B>DEH6 }I VL BuDEHI VL BDEHI VLhhhL OE[L6}` L01Іѩ/oЍ"/ԩLL` jL`6}8``Lt&'(L!ԍ Т! !o' Ӎ).C \6}&/ԩЩo0%1Іѩ`&i0i`.(HHHL_LԭӍ+) M+) -)6}M+,J ,) --+)N- 'N- N-'`'  !N- &  N-&  I-**6} Lb 8'i'`  &JJUU'JJT`  N-&  I-**4UVery briefly, this file is simply adriver that installs a device M: intothe IOCB block and bumps memlo up to$2580 under Sp:}artados 3.2D. Open by:OPEN #1,12,0,"M:" in basic with a GR0screen. Get #1 for input, Put #1 tochange the mouse color. When:} you Get,read Peek(84) and (85) for the lastlocation of the mouse when the buttonwas pressed. It uses some ram at $600to :}$606 for temporary storage. The driver starts at $1B00 and unlike theoriginal Antic mouse of a few yearspast, allows Disk :}I/O as well! Of course you have to "Close" the mousefirst. You'll find this one a bitsmoother in operation as well, wheny:}ou "Get" from the mouse.G.Filion #26-249 Kitchener Cresc. Kamloops, B.C., Canada V2B 1B9 For mor:}e info and/or the source code listing.-------------------------------------ada V2B 1B9 For mor8XMouse arc is a short ML program for use in basic programs. Docs are included. once installed, mouse handles the movement of >}the pointer and returns the position of the mouse click to the row and col mem locations... listed in the Docs. Mike... _>}_____________________________________________________________________________ Sherry L. Snyder L.P.N. >} Mike Todd - Publications. Tulane Dept. of Dermatology Tulane Dept. of Dermatology snyder10@convex1.>}tcs.tulane.edu dt01mws@music.tcs.tulane.edu New Orleans, Louisiana. Psychedelic Da>}ydreams ______________________________________________________________________________ Psychedelic Da<Y)`___________________________________________________________________ Psychedelic Da@I``H`xHԭH ӱ)ӱ ة؅h)h(``LLV̭Zḽ[m̩VZ̍[F"}`өҨӈӥ l 삆H Hʎ h`JJJJ1ޮJJ):̠F#}R WP`2υ3HH@9̭R ;͠9̭Ӎ=̭ԍ<̭ J;̭ jjH:ih;;_)? @H .; .;̭;̪F$}>x ;ͭ<̍ԭ=̍XR9 ;͠`hhh5h4HH,9P42`24`:ih;;_)? @H .; .;̭;̪DTRAMBOOT II Version 1.0 Copyright 1990 by Charles Hughes RAMBOOT II is a program that creates up to 4 ram floppies and twJ&}o ramdrives in your XL/XE. You need at least a 256K ram upgrade to use thisprogram. You also need a device called a JOYBIJ'}TTER. A text file describinghow to make one is included in RAMBOOT2.ARC. The JOYBITTER is used with RAMBOOT II in the folJ(}lowing way - the firebutton turns the ram drives on/off; the first set of two switches (up/downon a joystick) control whichJ)} ram floppy is in ram drive #1; the second setof two switches (left/right on a joystick) control which ram floppy is inram J*}drive #2. When the ram drives are turned on, the real drives can beaccessed as their drive number +2. So the real D1: coulJ+}d be accessed asD3:, D3: could be accessed as D5:, etc. RAMBOOT II is known to work with Atari DOS 2.0S, TOPDOS 1.2, SMARTJ,}DOS, andDOS XL. It should work with DOS 2.5, and MYDOS. It won't work withSpartaDOS or DOS XE. The SpartaDOS X cartridgeJ-} doesn't work with RAMBOOT IIright now, I am trying to remedy that problem. (The problem is with SDX, notmy program - ICD dJ.}idn't want to bother allowing for a RAM OS.) RAMBOOT IIwill have problems with DOSes that use a ramdisk, so boot DOS withouJ/}t aramdisk. To use RAMBOOT II pull out your JOYBITTER, if you don't have one, now is agood time to make it. Remove anythJ0}ing that may be plugged into the secondjoystick port. Load up your favorite DOS (if your favorite is Sparta thenload up AtJ1}ari DOS). Make sure all the switches on the Joybitter areswitched off and then plug it in. Load the program called "OSRD.J2}COM" from DOS (Binary Load). OSRD.COMcopies the OS ROM into the RAM underneath and then enables the OS RAM. Itthen patcheJ3}s the RAM OS with the ramdisk handler. OSRD.COM should return control to DOS in under 10 seconds. If the machineappears tJ4}o have locked up, hit RESET. If DOS returns load the program"OSON.COM". If DOS doesn't return, or the machine locks up aftJ5}er loadingOSON.COM, or your machine reboots on RESET then try another DOS. Get a directory listing of D1:, it should show J6}your DOS disk. Now turn onthe ram drives by pressing down the fire button on the Joybitter and get adirectory of D1:. YouJ7} should see garbage or a funny amount of sectors/bytesavailable. Get a directory of D3:, it should show your DOS disk. If J8}youget a directory of your DOS disk when the ram drives are enabled, you needto test out the Joybitter - see the Joybitter J9}text for a program to do this.If the Joybitter is fine, then start over at the beginning of this file. Ifyou reach this poJ:}int a second time you will need to use a different DOS. Since you've gotten this far it means you have a working setup. CJ;}ongratulate yourself, it took me a week to get to this point. You now have two single density, single sided ram drives accJ<}essed as D1:and D2:, and 2 (256K upgrade) or 4 (512k upgrade) ram floppies. If all youwant are ramdisks then you are finisJ=}hed, just format them in single densityand you can use them as you like. Didn't like that ending, eh? Wanna know what IJ>}'m doing wasting my timewriting ramdisk handlers that only allow single density disks right? Pssst....hey buddy, can ya keJ?}ep a secret? Me too. Just kidding. Four single density ram floppies are useless to me ingeneral, but I did this with J@}a specific purpose in mind. Ever play Ultima IV? I have, and it's a great game. It has a couple ofproblems though - it cJA}omes on 4 single density disks (does that number seemfamiliar?), can't be run off a hard drive, uses the standard skew (slowJB}reading the drive), and does a lot of disk access. My poor drives don'tlike that kind of abuse, and, lets face it, NOBODY JC}likes to constantlyswitch floppies in and out of a drive. So, as you can see, I was desperateto make my gaming easier. RAJD}MBOOT II was born out of that desperation. Ofcourse, Russ Babylon's program RAMBOOT, and Bob Wooley's wonderful PIOdevice/JE}program combination also contributed - thanks guys. Have you guessed? Yes, I knew you could - RAMBOOT II is for playinggaJF}mes, no more long disk accesses, no more overheated drives as you play"Leather Goddess of Phobos" (eh, Bob? :), no more waitJG}ing minutes while thenext part of the game loads. Okay, now for the bad news. Lots of games turn off the RAM OS and thisJH},of course, kills the ramdisk handler and defeats the whole purpose of thisfile. To get around this you need to modify theJI} game. The file "ULT4.ROS"is a basic program that will fix Ultima IV. Run it and follow directions toremove the code thatJJ} turns on the ROM OS. Make sure you have a backup ofUltima IV just in case. Copy protection by itself is no fun but doesnJK}'t bother RAMBOOT II. If youhave a lot of copy protected games, I suggest you beg for, borrow, or buyChipmunk and related JL}programs. These will unprotect your disks. I haveChipmunk so I ALWAYS unprotect my stuff as I buy it. Those games that aJM}re copy protected AND also turn off the RAM OS are apain in the you-know-where. If you want to use RAMBOOT II with these gaJN}mesthen you have two choices - make an unprotected backup, or notch theoriginal so it can be written to. Then modify the bJO}ackup (original) with a.ROS program. NOTE: You will need the correct .ROS program to modify the game. Don'tuse ULT4.ROS JP}to try and unprotect other games, it won't work. Other .ROSprograms will become available as I play the games and make the JQ}appropriate.ROS file for each one. Or as people ask for a .ROS file for their favoritegame. Now back to using the ram JR}drives for games... Since the ram drives can be accessed just like regular drives, and the ramfloppies will act just likeJS} regular floppies you can sector copy a disk ontothem. The best way to do this is with a sector copier program (or thesectJT}or copy utility built into several DOSes). Another way, if you don'thave a sector copier, or if you have a hard drive, is tJU}o use DISKCOMM 3.2. Copy your games disks to different ram floppies, making sure to write downon a piece of paper just whiJV}ch floppy has which game disk written on it. If you copy a protected boot disk you may come across bad sectors - justignorJW}e these, they aren't important right now. If you come across a badsector on any other disk, then that disk is probably bad JX}and you should makea new backup disk. If the game is unprotected you can set the Joybitter for the boot ramfloppy and theJY}n load the file "SOFTBOOT.COM". The game will load and youcan continue from there normally. When the game asks for a diffeJZ}rent disk,make sure you set the switches correctly for that switch. If the game is protected you need to boot from the reaJ[}l boot floppy. Turnoff the fire button on the Joybitter in order to disable the ram drives. Now load "SOFTBOOT.COM" and thJ\}e game will load. Once the real drive stopsspinning and you see the opening screen of the game, you can turn the ramdrivesJ]} back on - just make sure that ram drive #1 is set for the ram bootfloopy. From then on just use the ram floppies as neededJ^}. No, I haven't forgotten. To save a game (assuming that the game you areplaying allows that) just start the save game prJ_}ocess and when it asks forthe save disk, insert the real save floppy into the correct real drive, turnoff the fire button aJ`}nd continue. After it finishes saving you can turn thefire button back on and continue using the Joybitter. Now, if the Ja}game doesn't load correctly, or it does load but ignores theJoybitter & ram drives, it is one of those nasty ones that turnsJb} the OS ROMback on. Send me a note and I'll see what I can do about creating a .ROSprogram for it. If you are playing Jc}a game that requires more than 4 floppy sides, thenjust insert the disk(s) you didn't copy, when it is needed, and turn off Jd}thefire button. When you need to use a ram floppy again, turn the fire buttonback on. Well, that's all there is. HavJe}e fun with this and send me some responsesso I know somebody out there appreciates it. :) If you have any questions or cJf}omments I can be reached at:CLOSER TO HOME BBS (419) 368-4413ATARI BASE BBS (408) 745-5306BAAUG BBS (408) 98Jg}6-0215Usenet: Ordania-DM@cup.portal.com or Charles_Hughes@cup.portal.comOr USnail: Charles Hughes 555 E. WashingtonJh} Ave. #301 Sunnyvale, CA 94086 Phone: (408) 732-7749_Hughes@cup.portal.comOr USnail: Charles Hughes 555 E. WashingtonH8READ.ME The arc file RAMBOOT2.ARC contains the following files: READ.ME - you're reading this. RAMBOOT2.TXT -Nj} explains what this ARC is all about. JOYBITTR.TXT - explains how to build a Joybitter. JBTEST.BAS - a BASIC program Nk}to test the joybitter. OSRD.COM - copies OS ROM to OS RAM, enables RAM OS, then installs a RAMDISK hNl}andler. OSON.COM - turns RAM OS back on after a RESET. SOFTBOOT.COM - performs a disk boot without disabling the RANm}M OS or the RAMDISK handler. ULT4.ROS - removes a section of code in Ultima 4 that turns Nn} the OS ROM back on. This is Version 1.0 of RAMBOOT II.emoves a section of code in Ultima 4 that turns LB``L`OM back on. This is Version 1.0 of RAMBOOT II.emoves a section of code in Ultima 4 that turns PGADRIVML@@@ ATp@ ,;AW,;@,,67A),.Vq}.104,76,89,228--@@")67<,.>:,- 22(*INSERT ULTIMA 4 BOOT DISK IN A DISK DRIVE.!(Vr}WHICH DRIVE IS IT IN!(( MODIFYING...2 A</-@b@+67<,.>:A4,/ F AK(Vs}ALL DONE. GO PLAY.PREAD IN SECTOR 255!Ah@I!Ai'Ap@'Aq@dVt}- 6-C:,6-P:'AV,-6-&$AVArAs&At@10'AvA('AwVu}:'AxAU'AyD6-?:C:,,$WRITE OUT SECTOR 255!Ah@I!Ai'Vv}Ap@'AqA(ArAsAt@1'AvA('AwVw}'AxAU'Ay$6-?:C:,,$ D3:ULT4.ROS@1'AvA('AwTJ